'use strict';
let process_ns = new function() {
	/*
		Что я хочу сделать, в общем?
		1 Надо сделать Value - обьект для фиксированного значения входного выходного 'канала? :\'
			1.1 не уверен в его готовности
		2 Хочу сделать абстракный басовый функционал и интерфейс (абстрактная база)
			2.1 надо сделать модули (глобальные модули, регистрирование кастомных или глобальных модулей,
				может даже в качестве виртуальных файлов)
		3 Хочу сделать визуальный интерфейс над абстрактной базой
			3.1 нужно понять что нужно
		4 Хочу сделать виртуально окружение 'симуляцию системы'
			4.1 понять что делать, что нужно для того чтобы уверенно начать не боясь косяков с архитектурой в будущем
	
	
		Нужна логика:
		-[o] окружения где будет запускатся загруженный код
		-[o] 
	
	
	let code = codeShell(code);
	
	virtual_env.run(code);
	
	
	
	процес взаимодействия Process и Environment
	''''''''''''
	
	какой функционал я хочу получить на данный момент
	-[o] узел с in/out put и что в нутри
	
	
	- нужны системные комманды (global_modules)
	*/
	
	
	
	
	/*
		для изучить енв
		
		как сохранять данные (статические данные)
		loclaStorage | indexedDB | реальные файлы 
		сделать парсер строки (коочки сраные сделать)
		изучить тему кодирования, для кодирования файлов и данных
	*/
	
	const BASE_API = {
		Vector2, vec2, VectorN, vecN, EventEmitter, random, JSONcopy,
		Promise, Proxy, WeakRef,
		console, Date, Math, JSON, Set, Map, WeakSet, WeakMap,
		Object, Array, Function, Number, String, RegExp, BigInt, Symbol
	};
	
	
	
	// реестр модулей глобальных модулей
	let global_modules = {};
	global_modules.system = self => {
		let module = new EventEmitter();
		
		global_ns.binder.on('stdin', (...args) => module.emit('stdin', ...args));
	//	self.on('stdout', () => module.emit('stdout'));
		
	//	Object.defineProperty(module, 'stdin', { get: () => self.stdin.value });
	//	Object.defineProperty(module, 'stdout', { set: v => self.stdout.value = v });
		
		return module;
	};
	/*
		Класс обьектов которые будут представоять собой процес в виртуальной среде
	*/
	let Process = this.Process = class extends EventEmitter {
		constructor(p = {}) {
			super();
			
		//	свои модули будут добавлены когда будут реализована fs
			this._cache_modules = {};
			
			let process = {
				exit: code => this.exit(code || 0)
			};
			
			let require = id => id in this._cache_modules ? this._cache_modules[id] : this._cache_modules[id] = global_modules[id](this);
			
			
			let env_api = {
				process, require,
				
				...BASE_API
			};
			
			env_api.global = env_api;
			this._env_api = env_api;
			
			let api = Object.assign({}, p.api, this._env_api);
			
			this.compiledCode = codeShell(p.code, api);
			this.run();
		}
		
		run(file) {
		//	codeShell(file, this._env_api);
			this.compiledCode();
		}
		
		exit(code = 0) {
			
		}
		
	//	install() { this; }
	};
	
	
	
	
	/*							понять для чего
		Класс обьектов которые будут представоять собой виртуальную среду
		покачто только замена useAPI
	*/
	let Environment = this.Environment = class extends EventEmitter {
		constructor() {
			this.api = Object.assign({
				// 
			}, new.target.base_api);
		}
		
		static base_api = {
			Vector2, vec2, VectorN, vecN, EventEmitter, random, JSONcopy,
			Promise, Proxy, WeakRef,
			console, Date, Math, JSON, Set, Map, WeakSet, WeakMap,
			Object, Array, Function, Number, String, RegExp, BigInt, Symbol
		}
	};
	
	
	
	
	/*
		Panel.node > DataNode|.inter > Process|.emit('stdin');
	*/
};
